package com.mo.lib.view.chart

import com.github.mikephil.charting.charts.BarChart
import com.github.mikephil.charting.charts.BarLineChartBase
import com.github.mikephil.charting.charts.CandleStickChart
import com.github.mikephil.charting.charts.Chart
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.components.Legend
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.components.YAxis
import com.github.mikephil.charting.data.BarData
import com.github.mikephil.charting.data.BarDataSet
import com.github.mikephil.charting.data.BarEntry
import com.github.mikephil.charting.formatter.ValueFormatter
import com.mo.lib.utils.KLog.i

/**
 * @ author：mo
 * @ data：2022/8/24:15:32
 * @ 功能：
 */
/** 设置说明*/
fun Chart<*>.setDescription2(descriptionSetting: (Description.() -> Unit) = {}): Chart<*> {
    this.description.apply {
        isEnabled = false; // 不显示描述
        //        description.text = "mo"//描述文字
        //        description.textSize = 16f //描述文字大小
        //        description.textAlign = Paint.Align.CENTER;   //文本位置，右下角对标X轴的左、右、居中，默认右
        //        setNoDataText("暂无数据噢!") //没数据的时候显示
        //        //获取屏幕的中间坐标
        //        val wm: WindowManager = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        //        val dm = DisplayMetrics()
        //        wm.getDefaultDisplay().getMetrics(dm)
        //        val x: Float = (dm.widthPixels / 2).toFloat()
        //        setPosition(x, 40f)//设置描述文本显示位置
        descriptionSetting() //执行自定义设置
    }
    return this
}

/** 设置图例*/
fun Chart<*>.setLegend2(legendSetting: (Legend.() -> Unit) = {}): Chart<*> {
    this.legend.apply { //        isEnabled = false //是否显示图例
        //        form = Legend.LegendForm.CIRCLE // 图例标签样式 NONE==无、EMPTY==无但占位、DEFAULT==默认实心圆、SQUARE==正方形、CIRCLE==圆、 LINE==线、
        //        textColor = Color.BLUE //图例文本字体颜色
        //        textSize = 50f //图例文本字体大小
        //        formToTextSpace=50f//图例标签到文字之间的距离
        //        isWordWrapEnabled = true; //图例过多或过长是否自动换行
        //        xEntrySpace = 20f;    //图例X方向的间隔宽度
        //        yEntrySpace = 20f; //图例Y方向的间隔宽度
        //        maxSizePercent = 0.95f;  //图例最大相对大小，默认为0.95f(95%)
        //        verticalAlignment = Legend.LegendVerticalAlignment.TOP //垂直方向位置： TOP, CENTER, BOTTOM    默认BOTTOM
        //        horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER //水平方向位置：   LEFT, CENTER, RIGHT    默认LEFT
        //        orientation = Legend.LegendOrientation.VERTICAL// 图例方向： HORIZONTAL==与图表视图对齐, VERTICAL==与图表控件对齐    默认HORIZONTAL
        //        setDrawInside(true)//是否在图表内部绘制   默认false
        //        val legendEntry = LegendEntry()//自定义图例：设置后会覆盖原生图例，且设置后不可追加图例
        //        legendEntry.label="自定义图例"
        //        legendEntry.formColor=Color.RED
        //        legendEntry.formSize=10f
        //        legendEntry.formLineWidth=20f
        //        setCustom(arrayListOf(legendEntry))
        //        setExtra(mutableListOf<Int>(Color.RED,Color.RED).toIntArray(), mutableListOf<String>("增加图例","增加图例").toTypedArray())//追加图例，与自定义图例不可共存
        //        resetCustom()//重置取消自定义的图例
        legendSetting()
    }
    return this
}

/** 设置整体属性*/
fun Chart<*>.setChartSetting2(setting: (Chart<*>.() -> Unit) = {}): Chart<*> {
    return this.apply { //        setExtraOffsets(0f, 50f, 30f, 30f)//设置额外偏移量，等同于padding

        when (this) {
            is CandleStickChart -> { //蜡烛图
                //                setVisibleXRangeMaximum(6);// 设置当前图表中最多在x轴坐标线上显示的刻度线总量
                //            this.getDescription().setText("")
                //            this.getDescription().setTextColor(Color.RED)
                //            this.getDescription().setTextSize(16f) //设置描述的文字 ,颜色 大小
                //            this.setNoDataText("无数据噢") //没数据的时候显示
                setDrawBorders(false) //是否显示边框
                animateX(500) //x轴动画
                setTouchEnabled(true) // 设置是否可以触摸
                isDragEnabled = true // 是否可以拖拽
                setScaleEnabled(false) // 是否可以缩放 x和y轴, 默认是true
                isScaleXEnabled = true //是否可以缩放 仅x轴
                isScaleYEnabled = true //是否可以缩放 仅y轴
                setPinchZoom(true) //设置x轴和y轴能否同时缩放。默认是否
                isDoubleTapToZoomEnabled = true //设置是否可以通过双击屏幕放大图表。默认是true
                isHighlightPerDragEnabled = true //能否拖拽高亮线(数据点与坐标的提示线)，默认是true
                setDragDecelerationEnabled(true) //拖拽滚动时，手放开是否会持续滚动，默认是true（false是拖到哪是哪，true拖拽之后还会有缓冲）
                setDragDecelerationFrictionCoef(0.99f) //与上面那个属性配合，持续滚动时的速度快慢，[0,1) 0代表立即停止
            }
            is BarChart -> {
                setFitBars(false) //自动对齐
                //                    setDrawValueAboveBar(false) //是否将参数值绘制在柱状图上方显示，默认true，false==绘制在柱状图里
            }
        }
        setting()
    }
}

/** 设置X轴  HorizontalBarChart 向右旋转90度*/
fun Chart<*>.setXAxis2(xAxisSetting: (XAxis.() -> Unit) = {}): Chart<*> {
    this.xAxis.apply { //        textSize = 12f//文本大小
        //        axisMaximum = 3.6f//设置X轴最大值
        //        axisMinimum = -0.6f //把最小值设置为负数能够为下方留出点空白距离
        setDrawGridLines(false) //是否绘制X轴上的网格线（背景里面的竖线 HorizontalBarChart里的横线）
        //        position = XAxis.XAxisPosition.BOTTOM//设置X轴所在位置   默认为上面,值：BOTTOM,BOTH_SIDED,BOTTOM_INSIDE,TOP,TOP_INSID
        //        xOffset = 15f//设置标签距x轴的偏移量即距离
        //        labelCount = 4//X轴标签数量
        //        setLabelCount(6, false)//      X轴坐标的个数/X轴的刻度数量    第二个参数一般填false     true表示强制设置标签数 可能会导致X轴坐标显示不全等问题
        //        valueFormatter = object : ValueFormatter() {
        //            override fun getAxisLabel(value: Float, axis: AxisBase?): String {//设置标签显示内容
        //                return arrayOf("燃气经营", "燃气运输", "燃气用户", "燃气具")[value.toInt()] //注意这里不需要显示的要改成 ""
        //            }
        //        }
        //        granularity = 1f //粒度 设置X轴坐标之间的最小间隔（因为此图有缩放功能，X轴,Y轴可设置可缩放）
        //        axisLineColor = Color.rgb(245, 133, 179); //X轴颜色
        //        axisLineWidth = 2f;   //X轴粗细
        xAxisSetting()
    }
    return this
}

/** 设置左Y轴  */
fun Chart<*>.setAxisLeft2(leftAxis: (YAxis.() -> Unit) = {}): Chart<*> {
    when (this) {
        is BarLineChartBase<*> -> { //            axisLeft.isEnabled = true //是否可见
            axisLeft.axisMinimum = 0f //保证Y轴从0开始，不然会上移一点
            //            axisLeft.setDrawGridLines(false) //是否绘制Y轴上的网格线（背景里面的横线）
            //            axisLeft.textColor = Color.rgb(63, 91, 107) //文本颜色
            //            axisLeft.gridColor = Color.rgb(63, 91, 107) //表格线颜色
            //            axisLeft.axisLineColor = Color.rgb(63, 91, 107) //Y轴颜色
            //            //        axisLeft.setAxisLineWidth(1);           //Y轴粗细
            //            axisLeft.granularity = 1f //粒度
            //            axisLeft.valueFormatter = object : ValueFormatter() {
            //                //Y轴自定义坐标
            //                override fun getFormattedValue(v: Float): String { //            return (v.toString() + "").toDouble().getString(0)
            //                    return v.toString()
            //                }
            //            } //        axisLeft.setAxisMaximum(15);   //Y轴最大数值
            //            this.axisMinimum = 0f //Y轴最小数值
            //            //            Y轴坐标的个数    第二个参数一般填false     true表示强制设置标签数 可能会导致X轴坐标显示不全等问题
            //            this.setLabelCount(5, false)
            axisLeft.leftAxis()
        }
    }
    return this
}

/** 设置右Y轴  */
fun Chart<*>.setAxisRight2(rightAxis: (YAxis.() -> Unit) = {}): Chart<*> {
    when (this) {
        is BarLineChartBase<*> -> { //            this.axisRight.isEnabled = true //是否可见
            //            this.axisRight.axisMinimum = 0f //保证Y轴从0开始，不然会上移一点
            this.axisRight.rightAxis()
        }
    }
    return this
}

fun Chart<*>.loadBarData(barEntyList: List<BarEntry>, label: String, block: (BarData.() -> Unit) = {}): Chart<*> {

    return loadBarData(barEntyList, label, barData = block)
}

fun Chart<*>.loadBarData(barEntyList: List<BarEntry>, label: String, barDataSet: (BarDataSet.() -> Unit) = {}, barData: (BarData.() -> Unit) = {}): Chart<*> {
    val barDataSet = BarDataSet(barEntyList, label)
    barDataSet.barDataSet() //        barDataSet.apply {//可分别
    ////            valueTextSize = 16f //柱块上的字体大小
    ////            valueTextColor = Color.RED //柱块上的字体颜色
    ////            valueTypeface = Typeface.DEFAULT_BOLD //加粗
    ////            valueFormatter = object : ValueFormatter() {
    ////                override fun getAxisLabel(value: Float, axis: AxisBase?): String {
    ////                    return String.format("%.2f", value) + "%" //保留两位小数
    ////                }
    ////            }
    ////            barDataSet.setColors( resources.getColor(R.color.text_green), resources.getColor(R.color.text_red))//依次设置每次柱块的颜色
    //        }
    //        barDataSet.setColors( resources.getColor(R.color.text_green), resources.getColor(R.color.text_red))//依次设置每次柱块的颜色
    val barData = BarData(barDataSet) //        barData.barWidth = 0.2f //设置柱块的宽度
    barData.barData()
    (this@loadBarData as Chart<BarData>).data = barData
    this@loadBarData.invalidate()
    return this
}

fun Chart<*>.loadBarDataGroup(yAxisValues: List<List<Float>>, clors: List<Int>, barDataSet: (BarDataSet.() -> Unit) = {}, barData: (BarData.() -> Unit) = {}): Chart<*> {
    val data = BarData()
    for (i in yAxisValues.indices) {
        val entries = ArrayList<BarEntry>()
        for (j in yAxisValues[i].indices) {
            entries.add(BarEntry(j.toFloat(), yAxisValues[i][j]))
        }
        val barDataSet = BarDataSet(entries, "")
        barDataSet.color = clors.get(i)
        barDataSet.valueTextColor = clors.get(i)
        barDataSet.valueTextSize = 10f
        barDataSet.axisDependency = YAxis.AxisDependency.LEFT
        data.addDataSet(barDataSet)
    }
    val amount = yAxisValues.size

    val groupSpace = 0.3f //柱状图组之间的间距

    val barSpace = ((1 - 0.12) / amount / 10).toFloat() // x4 DataSet

    val barWidth = ((1 - 0.3) / amount / 10 * 9).toFloat() // x4 DataSet


    // (0.2 + 0.02) * 4 + 0.08 = 1.00 -> interval per "group"

    // (0.2 + 0.02) * 4 + 0.08 = 1.00 -> interval per "group"
//    xAxis.setLabelCount(yAxisValues.size - 1, false)
    data.barWidth = barWidth
    val xValues = arrayOf("小学", "初中")
    xAxis.valueFormatter = object : ValueFormatter() {
        override fun getFormattedValue(value: Float): String { //                for (int i=0;i<xAxisValues.size();i++){
            //                    if(value==(xAxisValues.get(i)-1)) {
            //                        return xValues[i];
            //                    }
            //                }
            //                return "";
            i(value.toString() + "") //                return xValues[(int) value];
            return value.toString() + ""
        }
    }
    data.groupBars(0f, groupSpace, barSpace)
    (this@loadBarDataGroup as Chart<BarData>).data = data
    xAxis.axisMaximum = 2f
    xAxis.axisMinimum = 0f
    xAxis.setLabelCount(2, false)
    return this
}